package tool

import (
	"encoding/json"
	"errors"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"

	"gitee.com/cloudapex/ulern/util"
)

type TQServer struct {
	Server  string `json:"server"`
	Call    string `json:"call"`
	Tokena  string `json:"in_token"`
	AppKey  string `json:"appkey"`
	Admin   int64  `json:"admin"`
	SToken  string `json:"-"`
	STAa    int64  `json:"-"`
	CLenght int64  `json:"-"`
}

type SToken struct {
	ECode int    `json:"errorCode"`
	Token string `json:"access_token"`
	UseAt int    `json:"expires_in"`
}

type CallMessage struct {
	Id      int64  `json:"id"`              // 记录ID
	UIn     int64  `json:"uin"`             // 座席ID
	CallrId string `json:"caller_id"`       // 客户电话
	CalldId string `json:"called_id"`       // 座席电话
	CType   int64  `json:"call_style"`      // 呼叫方式 3 外乎 5 乎入
	InserAt int64  `json:"insert_time"`     // 本次呼叫时间
	CState  int64  `json:"is_called_phone"` // 本次呼叫状态 1 接通 ， 非 1 值未接通
	Duratio int64  `json:"duration"`        // 通话时长
	Ring    int64  `json:"ringTime"`        // 响铃时长
	ADCode  int64  `json:"area_id"`         // 地理行政便码
	Fage    string `json:"client_id"`       // 通话标志
	AName   string `json:"callerArea"`      // 地理名称
	RFile   string `json:"recordfile"`      // 录音URL连接
	HClose  int64  `json:"hangup_side"`     // 挂机方
}

func (this *CallMessage) Print() {
	fmt.Println("座 席 ID:", this.UIn)
	fmt.Println("通话标志:", this.Fage)
	fmt.Println("客户电话:", this.CallrId)
	fmt.Println("座席电话:", this.CalldId)
	fmt.Println("呼叫方式:", this.CType)
	fmt.Println("呼叫时间:", this.InserAt)
	fmt.Println("呼叫状态:", this.CState)
	fmt.Println("通话时长:", this.Duratio)
	fmt.Println("响铃时长:", this.Ring)
	fmt.Println("行政编码:", this.ADCode)
	fmt.Println("地理名称:", this.AName)
	fmt.Println("录音连接:", this.RFile)
}

type CallData struct {
	LSize int           `json:"listSize"` // 返回列表长度
	Total int           `json:"total"`    // 总长度
	PSize int           `json:"pageSize"` // 每页长度
	Page  int           `json:"page"`     // 当前页码
	List  []CallMessage `json:"list"`
}

type CallRecord struct {
	ErrCode int      `json:"errorCode"` // 错误码
	Message string   `json:"message"`   // 错误消息
	Data    CallData `json:"data"`
}

type Result struct {
	id string `message_id`
}

type CallValue struct {
	Status int    `json:"result_status"`
	Desc   string `json:"result_desc"`
	Resu   Result `json:"result"`
}

var g_TqToken TQServer

func UseTQ() TQServer {
	return g_TqToken
}

/*
 * 描述: 获取QT的个人TOKEN
 *
 *********************************************************************************/
func (this *TQServer) GetPToken(id int64, pw string) (string, error) {
	resp, err := http.Get(fmt.Sprintf("%s?uin=%d&pw=%s", this.Tokena, id, pw))
	if err != nil {
		fmt.Println("err:", err)
		return "", err
	}
	defer resp.Body.Close()
	var sil []byte
	sil, err = ioutil.ReadAll(resp.Body)
	return string(sil[6:]), err
}

/*
 * 描述: 打电话
 *
 *********************************************************************************/
func (this *TQServer) CallPhone(bill_no, phone, token string, uid int64) (bool, error) {
	para := fmt.Sprintf("kefu_uin=%d&access_token=%s&phone=%s&admin_uin=%d&client_id=%s",
		uid,
		token,
		phone,
		this.Admin,
		bill_no)

	data, err := util.PayFormPost(this.Call, para)
	var val CallValue
	json.Unmarshal(data, &val)
	fmt.Println(val)
	fmt.Println(this.Call)
	fmt.Println(para)

	if val.Status == 0 || val.Status == 1 {
		return true, nil
	}
	return false, err
}

/*
 * 描述: 统计个人打电话数据
 *
 *********************************************************************************/
//func (this *TQServer) Statistical(start, end, tqid int64, val *modes.CStatistica) error {
//	//"uin=9846624&pageSize=1000" )
//	err := this.GetToken()
//	if err == nil {
//		var record CallRecord
//		api := fmt.Sprintf("%s/webservice/phoneRecord/list?access_token=%s&admin_uin=%d",
//			this.Server, this.SToken, this.Admin)
//		para := fmt.Sprintf("uin=%d&pageSize=1000&start_time=%d&end_time=%d",
//			tqid,
//			start,
//			end)
//		data, err := util.PayFormPost(api, para)
//		if err != nil {
//			return err
//		}
//		json.Unmarshal(data, &record)
//		for i, _ := range record.Data.List {
//			record.Data.List[i].Print()
//			val.CallN++ // 拨打次数
//			val.WaitL += record.Data.List[i].Ring
//			if record.Data.List[i].CState == 1 {
//				val.AcallN++ // 接通次数
//			}
//			if record.Data.List[i].HClose == 1 {
//				val.CloseN++ // 挂断次数
//			}
//			if record.Data.List[i].CType == 3 {
//				val.InputL += record.Data.List[i].Duratio // 呼入时长 秒
//			} else {
//				val.OutputL += record.Data.List[i].Duratio // 呼出时长 秒
//			}
//		}
//	}
//	return err
//}
//
//func (this *TQServer) BillNoInfo(bill_no string, val *modes.CallPhone) error {
//	err := this.GetToken()
//	if err == nil {
//		var record CallRecord
//		api := fmt.Sprintf("%s/webservice/phoneRecord/list?access_token=%s&admin_uin=%d",
//			this.Server, this.SToken, this.Admin)
//		para := fmt.Sprintf("fsunique_id=%s", bill_no)
//		data, err := XFormPost(api, para)
//		if err != nil {
//			return err
//		}
//		fmt.Println("TQServer::BillNoInfo", string(data))
//		json.Unmarshal(data, &record)
//		if record.Data.Total == 1 {
//			val.TQBill = bill_no
//			val.Duratio = record.Data.List[0].Duratio
//			val.Ring = record.Data.List[0].Ring
//			val.Area = record.Data.List[0].AName
//			val.FRecord = record.Data.List[0].RFile
//			val.CallSty = record.Data.List[0].CType
//			_, err = val.TQBillSet("duration,ring,area,f_record,call_style")
//		}
//		return err
//	}
//	return err
//}
//
//func (this *TQServer) BillNoInfone(bill_no string, val *modes.CallPhone) (string, error) {
//	var record CallRecord
//	token, err := g_TqToken.GetTokens()
//	if err != nil {
//		return "token错误", err
//	}
//	api := fmt.Sprintf("http://webservice.mobile.tq.cn/webservice/phoneRecord/list?access_token=%s&admin_uin=9838932", token)
//	para := fmt.Sprintf("client_id=%s", bill_no)
//	data, err := XFormPost(api, para)
//	fmt.Println(err, "err", "data", string(data))
//	if err != nil {
//		return "", err
//	}
//	json.Unmarshal(data, &record)
//	if record.Data.Total == 1 {
//		val.TQBill = bill_no
//		val.Duratio = record.Data.List[0].Duratio
//		val.Ring = record.Data.List[0].Ring
//		val.Area = record.Data.List[0].AName
//		val.FRecord = record.Data.List[0].RFile
//		val.CallSty = record.Data.List[0].CType
//		_, err = val.TQBillSet("duration,ring,area,f_record,call_style")
//	}
//	return val.FRecord, err
//}
//
//func (this *TQServer) BillNoInfotwo(bill_no string, val *modes.CallPhone) (string, error) {
//	var record CallRecord
//	token, err := g_TqToken.GetTokens()
//	if err != nil {
//		return "token错误", err
//	}
//	api := fmt.Sprintf("http://webservice.mobile.tq.cn/webservice/phoneRecord/list?access_token=%s&admin_uin=9838932", token)
//	para := fmt.Sprintf("fsunique_id=%s", bill_no)
//	data, err := XFormPost(api, para)
//	if err != nil {
//		return "", err
//	}
//	json.Unmarshal(data, &record)
//	fmt.Println(record, "_______record")
//	if record.Data.Total == 1 {
//		val.TQBill = bill_no
//		val.Duratio = record.Data.List[0].Duratio
//		val.Ring = record.Data.List[0].Ring
//		val.Area = record.Data.List[0].AName
//		val.FRecord = record.Data.List[0].RFile
//		val.CallSty = record.Data.List[0].CType
//		_, err = val.TQBillSet("duration,ring,area,f_record,call_style")
//	}
//	return val.FRecord, err
//}

func (this *TQServer) GetToken() error {
	now_at := time.Now().Unix()
	if (now_at - this.STAa) > 7200 {
		this.STAa = time.Now().Unix()
		api := fmt.Sprintf("%s/webservice/getAccessToken", this.Server)
		sign := util.MD5s(fmt.Sprintf("%d$%s$%d", this.Admin, this.AppKey, this.STAa))
		para := fmt.Sprintf("sign=%s&ctime=%d&admin_uin=%d", sign, this.STAa, this.Admin)
		data, err := util.PayFormPost(api, para)
		if err != nil {
			return err
		}
		var val SToken
		json.Unmarshal(data, &val)
		if val.ECode == 0 {
			this.SToken = val.Token
		} else {
			this.STAa = 0
			return errors.New("TQ Server Error")
		}
	}
	return nil
}

func (this *TQServer) CallRecord(para string) (CallRecord, error) {
	var record CallRecord
	err := this.GetToken()
	if err == nil {
		api := fmt.Sprintf("%s/webservice/phoneRecord/list?access_token=%s&admin_uin=%d",
			this.Server, this.SToken, this.Admin)
		data, err := util.PayFormPost(api, para)
		if err != nil {
			return record, err
		}
		json.Unmarshal(data, &record)
	}
	return record, err
}

func init() {
	//jsonFile, err := os.Open("./config/tq.json")
	//if err != nil {
	//	panic("打开文件错误，请查看:" + err.Error())
	//}
	//defer jsonFile.Close()
	//data, err := ioutil.ReadAll(jsonFile)
	//json.Unmarshal(data, &g_TqToken)
	//if err := g_TqToken.GetToken(); err != nil {
	//	panic("打开文件错误，请查看:" + err.Error())
	//}
	//fmt.Println("tq", g_TqToken)
}

func main() {
	data, err := g_TqToken.CallRecord("uin=9846624&pageNum=1&pageSize=10")
	fmt.Println(err)
	for _, v := range data.Data.List {
		v.Print()
	}
	token, _ := g_TqToken.GetPToken(9846624, "tq.cn")
	fmt.Println("toke:", token)
	fage, era := g_TqToken.CallPhone("aaaaa", "19803091863", token, 9846624)
	fmt.Println("fage", fage, era.Error())
}

func (this *TQServer) GetTokens() (string, error) {
	times := time.Now().Unix()
	api := fmt.Sprintf("http://webservice.mobile.tq.cn/webservice/getAccessToken")
	sign := util.MD5s(fmt.Sprintf("9838932$DMRZ8102*94!2$%d", times))
	para := fmt.Sprintf("sign=%s&ctime=%d&admin_uin=%d", sign, times, 9838932)
	data, err := util.PayFormPost(api, para)
	if err != nil {
		return "", err
	}
	var val SToken
	json.Unmarshal(data, &val)
	if val.ECode == 0 {
		stoken := val.Token
		return stoken, err
	} else {
		return "", errors.New("TQ Server Error")
	}
}
